package com.yeti.service;

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.yeti.domain.Cliente;
import com.yeti.domain.Role;
import com.yeti.form.RegistroForm;
import com.yeti.repository.ClienteDAO;
import com.yeti.repository.RoleDao;

@Component
public class ClienteServiceImpl implements ClienteService{
	
	@Autowired
	private ClienteDAO clienteDao;
	@Autowired
	private RoleDao roleDao;

	
	/**
	 * Metodo que comprueba si un usuario ya esta registrado en el sistema.
	 * 
	 * @param username: Es el nombre de usuario a comprobar si esta en el sistema.
	 * @return devuelve true si el usuario existe o false en caso contrario.
	 */
	@Override
	@Transactional(readOnly = true)
	public boolean exists(String username) {
		if(clienteDao.getCliente(username)!=null){
			return true;
		}else{
			return false;
		}
	}

	/**
	 * Metodo que registra a un cliente una vez comprobado que los datos son correctos.
	 * 
	 * @param registroForm: Son los datos del cliente una vez validados.
	 * @return devuelve true si el almacenamiento fue correcto o false en caso contrario.
	 */
	@Override
	@Transactional(readOnly = false)
	public boolean registrar(RegistroForm registroForm) {
		Role roleInstance = roleDao.getRole("ROLE_CLIENTE");
		
		if(roleInstance==null){
			return false;
		}
		
		Cliente c = new Cliente();
		c.setApellido1(registroForm.getApellido1());
		c.setApellido2(registroForm.getApellido2());
		c.setNombre(registroForm.getNombre());
		c.setDireccion(registroForm.getDireccion());
		c.setFechaNacimiento(registroForm.getFechaNacimiento());
		c.setRole(roleInstance);
		c.setPassword(md5(registroForm.getPassword()));
		c.setTelefono(registroForm.getTelefono());
		c.setUsername(registroForm.getUser());
		
		return clienteDao.addCliente(c);
			
	}
	
	/**
	 * Metodo que convierte una cadena de texto a md5.
	 * 
	 * @param input: Cadena a convertir.
	 * @return devuelve la cadena en md5 si fue correcto, null en caso contrario.
	 */
	
	public static String md5(String input) {
        String md5 = null;
        if(null == input) return null;
        try {  
	        MessageDigest digest = MessageDigest.getInstance("MD5");
	        digest.update(input.getBytes("UTF-8"), 0, input.length());
	        md5 = new BigInteger(1, digest.digest()).toString(16);
	        while(md5.length()<32){
	        	md5 = '0'+md5;
	        }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
        return md5;
    }
	
	
	/**
	 * Metodo que recoge todos los clientes del sistema
	 * 
	 * @return
	 */
	public List<Cliente> getClientes(){
		return clienteDao.getClientes();
	}

}
